ir = iris
a = seq(1:15)
c = sample(20,15)
plot(a,c,col = "red", pch = "*", main = "A Title", xlab = "X Label", ylab = "Y Label")

b = sample(20,15)
plot(a,c,col = "red", pch = "*", main = "A Title", xlab = "X Label", ylab = "Y Label")
points(a,b,col = "blue", pch = "+")

a = 1:15
plot(a,c, col = "red", type = "l", main = "A Title", xlab = "X Label", ylab = "y Label")
lines(a,b, col = "blue")

a = 1:15
plot(a,c,col = "red", type = "l", main = "A Title", xlab = "X Label", ylab = "Y Label")
lines(a,b, col = "Blue")
legend("bottomright", c("Variable c", "Variable b"), col = c("red", "blue"), pch = 16)

# pie chart
pie(table(ir$Species))

pie(table(ir$Species), col = c("white","blue","red"), main = "Classes in Iris")

# Scatterplots
plot(ir$Sepal.Length,ir$Sepal.Width, ylab = "Sepal Width", xlab = "Sepal Length", main = "Sepal Width vs Sepal Length")

# colour points
plot(ir$Sepal.Length,ir$Sepal.Width, xlab = "Sepal Length", ylab = "Sepal Width", main = "Sepal Width vs Speal Length", col = "red")

# Points will be coloured according to ir$Species
plot(ir$Sepal.Length,ir$Sepal.Width, xlab = "Sepal Length", ylab = "Sepal Width", main = "Sepal Width vs Sepal Lenght", col = ir$Species)

# Histogram
hist(ir$Sepal.Width)

hist(ir$Sepal.Length)

hist(ir$Sepal.Width, breaks = 15, col = "red", main = "Histogram of Sepal Width", xlab = "Sepal Width")

hist(ir$Sepal.Width, breaks = seq(1,5,0.2), col = "purple", main = "Histogram of Sepal width", xlab = "Sepal Width
")

hist(ir$Sepal.Width, breaks = seq(1,5,0.2), col = "purple", main = "Histogram of Sepal Width")
abline(v=mean(ir$Sepal.Width),col = "red", lwd = 3)
abline(v=median(ir$Sepal.Width),col = "green", lwd = 3)
legend("topright",c("mean","median"),col = c("red","green"),pch=16)

boxplot(ir$Sepal.Length, xlab = "Sepal Length")

boxplot(ir[,1:4], main = "Boxplot of Iris atributes")

# arranges graphs in rows
par(mfrow=c(1,2))# 1row, 2 columns
boxplot(ir$Sepal.Length, las = 3, main = "Sepal Length")
boxplot(ir$Sepal.Width, las = 3, main = "Sepal Width")

pairs(ir[,1:2])

pairs(ir[,1:4], col = ir$Species)

# 3D Graphs
library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
plot_ly(ir, x = ~Sepal.Width, y = ~Sepal.Length, z = ~Petal.Length, color = ~Species, colors = c('#CA381B', '#BFE82A','#BFA8AA')) %>% add_markers()
# ggplot2
library(ggplot2)
ir = iris
names(ir) = c("sepal.length","sepal.width", "petal.length","petal.width","class")
names(ir)
[1] "sepal.length" "sepal.width"  "petal.length" "petal.width"  "class"       
ggplot(ir) + geom_point(aes(x=sepal.length, y=sepal.width, color = class))

# visualistaion
ggplot(subset(ir, class %in% c("setosa", "virginica"))) +
  geom_point(aes(x=sepal.length, y=sepal.width, color=class))

# points (scatterplots)
ir_set = subset(ir, class %in% c("setosa"))
ggplot(ir_set, aes(x=petal.length,y=petal.width)) + geom_point() +
  ggtitle("Petal Length vs Petal Width")

ggplot(ir_set) + geom_point(aes(x=petal.length/petal.width, y=sepal.length/sepal.width)) +
  ggtitle("ScatterPlot of Rations")

# Lines
ir_versi = subset(ir, class %in% c("versicolor", "virginica"))
ir_versi$pred.SL = predict(lm(sepal.length ~ log(petal.length), data = ir_versi))
ggplot(ir_versi, aes(x=log(petal.length),y=sepal.length)) + 
  geom_point(aes(color = class)) + geom_line(aes(y=pred.SL)) +
  ggtitle("Sepal Length vs log(petal.length) Fitted with Regression Line")

ir_set = subset(ir, class %in% c("setosa"))
ggplot(ir_set, aes(x=sepal.length, y=sepal.width)) + geom_point() + geom_smooth()

# Boxplot
ggplot(ir) +
  geom_boxplot(aes(x=class, y=sepal.length)) + 
  ggtitle("Boxplot of Sepal Length")

# let's create "indoor" , a categorical variable recording if the plants were indoor(TRUE) or outdoor (FALSE) plants
# For the purpose of this example, we will give it random values
ir$indoor = sample(c("TRUE","FALSE"),150,replace=TRUE)
ggplot(ir) + geom_boxplot(aes(x=class,y=sepal.length, fill=indoor))

stacked_ir = stack(ir[,1:4])
head(stacked_ir,5)
ggplot(stack(ir[,1:4]), aes(x=ind,y=values)) + geom_boxplot() +
  xlab("Attributes") + ylab("Milimiters") + 
  ggtitle("Boxplot of Attributes")

library("ggrepel")
ggplot(ir,aes(x=sepal.length,y=sepal.width)) + 
  geom_text(aes(label=petal.length), size=3) +
  ggtitle("Sepal Length vs Sepal Width")

library(ggrepel)
Loading required package: ggplot2
p1 = ggplot(ir_set, aes(x=sepal.length,y=sepal.width))
p1 + geom_point() + geom_text_repel(aes(label=petal.length), force=3)

# Aesthetic Mapping
p1 +
  geom_point(aes(size = 2),
             color = "red")

ggplot(ir, aes(x=sepal.length,y=sepal.width)) +
  geom_point(aes(color=petal.length, shape = class))

# Scale Modification
p1 = ggplot(ir, aes(x=petal.length,y=petal.width)) + 
  geom_point()
p1

# Now, let’s create a new scale, that divides flowers into “S, M, L, XL,XXL” according to their Sepal Length. We manually code each size interval so that S < 4.3, 4.3 < M < 5.3, 5.3 < L < 6.3, 6.3 < XL < 7.9, and XXL > 7.9. 
p1 + geom_point(aes(color=sepal.length),
                alpha=0.5,size=1.5) + 
  scale_x_continuous(name = "Length of the pentals") +
  scale_y_continuous(name = "Width of the pentals") +
  scale_color_continuous(name = "",
                         breaks = c(4.3,5.3,6.3,7.3,7.9),
                         labels = c("S","M","L","XL","XXL"),
                         low = "blue", high = "red")

# Faceting
cw = ChickWeight
# Take a look at the dataset
head(cw,5)
p = ggplot(cw, aes(x=weight,y=Time))
p + geom_line(aes(color = Diet))

p + geom_line() + facet_wrap(~Diet)

p5 = p + geom_line() + facet_grid(~Diet)
p5

p5 + theme_classic()

p5 + theme_gray()

p5 + theme_bw()

p5 + theme_minimal() +
  theme(text = element_text(color = "turquoise"),
        strip.background = element_rect(fill = "turquoise"))

theme_new <- theme_bw() +
  theme(plot.background = element_rect(size = 1, color ="gray", fill = "black"),
        text = element_text(size = 12, color = "ivory"),
        axis.text.y = element_text(color = "purple"),
        axis.text.x = element_text(color = "turquoise"),
        panel.background = element_rect(fill = "pink"),
        strip.background = element_rect(fill = "orange")
      
        )
p5 + theme_new

LS0tCnRpdGxlOiAiTGFiNi1JbnN0cnVjdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KaXIgPSBpcmlzCmBgYApgYGB7cn0KYSA9IHNlcSgxOjE1KQpjID0gc2FtcGxlKDIwLDE1KQpwbG90KGEsYyxjb2wgPSAicmVkIiwgcGNoID0gIioiLCBtYWluID0gIkEgVGl0bGUiLCB4bGFiID0gIlggTGFiZWwiLCB5bGFiID0gIlkgTGFiZWwiKQpgYGAKYGBge3J9CmIgPSBzYW1wbGUoMjAsMTUpCnBsb3QoYSxjLGNvbCA9ICJyZWQiLCBwY2ggPSAiKiIsIG1haW4gPSAiQSBUaXRsZSIsIHhsYWIgPSAiWCBMYWJlbCIsIHlsYWIgPSAiWSBMYWJlbCIpCnBvaW50cyhhLGIsY29sID0gImJsdWUiLCBwY2ggPSAiKyIpCmBgYApgYGB7cn0KYSA9IDE6MTUKcGxvdChhLGMsIGNvbCA9ICJyZWQiLCB0eXBlID0gImwiLCBtYWluID0gIkEgVGl0bGUiLCB4bGFiID0gIlggTGFiZWwiLCB5bGFiID0gInkgTGFiZWwiKQpsaW5lcyhhLGIsIGNvbCA9ICJibHVlIikKYGBgCmBgYHtyfQphID0gMToxNQpwbG90KGEsYyxjb2wgPSAicmVkIiwgdHlwZSA9ICJsIiwgbWFpbiA9ICJBIFRpdGxlIiwgeGxhYiA9ICJYIExhYmVsIiwgeWxhYiA9ICJZIExhYmVsIikKbGluZXMoYSxiLCBjb2wgPSAiQmx1ZSIpCmxlZ2VuZCgiYm90dG9tcmlnaHQiLCBjKCJWYXJpYWJsZSBjIiwgIlZhcmlhYmxlIGIiKSwgY29sID0gYygicmVkIiwgImJsdWUiKSwgcGNoID0gMTYpCmBgYApgYGB7cn0KIyBwaWUgY2hhcnQKcGllKHRhYmxlKGlyJFNwZWNpZXMpKQpgYGAKYGBge3J9CnBpZSh0YWJsZShpciRTcGVjaWVzKSwgY29sID0gYygid2hpdGUiLCJibHVlIiwicmVkIiksIG1haW4gPSAiQ2xhc3NlcyBpbiBJcmlzIikKYGBgCmBgYHtyfQojIFNjYXR0ZXJwbG90cwpwbG90KGlyJFNlcGFsLkxlbmd0aCxpciRTZXBhbC5XaWR0aCwgeWxhYiA9ICJTZXBhbCBXaWR0aCIsIHhsYWIgPSAiU2VwYWwgTGVuZ3RoIiwgbWFpbiA9ICJTZXBhbCBXaWR0aCB2cyBTZXBhbCBMZW5ndGgiKQpgYGAKYGBge3J9CiMgY29sb3VyIHBvaW50cwpwbG90KGlyJFNlcGFsLkxlbmd0aCxpciRTZXBhbC5XaWR0aCwgeGxhYiA9ICJTZXBhbCBMZW5ndGgiLCB5bGFiID0gIlNlcGFsIFdpZHRoIiwgbWFpbiA9ICJTZXBhbCBXaWR0aCB2cyBTcGVhbCBMZW5ndGgiLCBjb2wgPSAicmVkIikKYGBgCmBgYHtyfQojIFBvaW50cyB3aWxsIGJlIGNvbG91cmVkIGFjY29yZGluZyB0byBpciRTcGVjaWVzCnBsb3QoaXIkU2VwYWwuTGVuZ3RoLGlyJFNlcGFsLldpZHRoLCB4bGFiID0gIlNlcGFsIExlbmd0aCIsIHlsYWIgPSAiU2VwYWwgV2lkdGgiLCBtYWluID0gIlNlcGFsIFdpZHRoIHZzIFNlcGFsIExlbmdodCIsIGNvbCA9IGlyJFNwZWNpZXMpCmBgYApgYGB7cn0KIyBIaXN0b2dyYW0KaGlzdChpciRTZXBhbC5XaWR0aCkKaGlzdChpciRTZXBhbC5MZW5ndGgpCmBgYApgYGB7cn0KaGlzdChpciRTZXBhbC5XaWR0aCwgYnJlYWtzID0gMTUsIGNvbCA9ICJyZWQiLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBTZXBhbCBXaWR0aCIsIHhsYWIgPSAiU2VwYWwgV2lkdGgiKQpgYGAKYGBge3J9Cmhpc3QoaXIkU2VwYWwuV2lkdGgsIGJyZWFrcyA9IHNlcSgxLDUsMC4yKSwgY29sID0gInB1cnBsZSIsIG1haW4gPSAiSGlzdG9ncmFtIG9mIFNlcGFsIHdpZHRoIiwgeGxhYiA9ICJTZXBhbCBXaWR0aAoiKQpgYGAKYGBge3J9Cmhpc3QoaXIkU2VwYWwuV2lkdGgsIGJyZWFrcyA9IHNlcSgxLDUsMC4yKSwgY29sID0gInB1cnBsZSIsIG1haW4gPSAiSGlzdG9ncmFtIG9mIFNlcGFsIFdpZHRoIikKYWJsaW5lKHY9bWVhbihpciRTZXBhbC5XaWR0aCksY29sID0gInJlZCIsIGx3ZCA9IDMpCmFibGluZSh2PW1lZGlhbihpciRTZXBhbC5XaWR0aCksY29sID0gImdyZWVuIiwgbHdkID0gMykKbGVnZW5kKCJ0b3ByaWdodCIsYygibWVhbiIsIm1lZGlhbiIpLGNvbCA9IGMoInJlZCIsImdyZWVuIikscGNoPTE2KQpgYGAKYGBge3J9CmJveHBsb3QoaXIkU2VwYWwuTGVuZ3RoLCB4bGFiID0gIlNlcGFsIExlbmd0aCIpCmBgYApgYGB7cn0KYm94cGxvdChpclssMTo0XSwgbWFpbiA9ICJCb3hwbG90IG9mIElyaXMgYXRyaWJ1dGVzIikKYGBgCmBgYHtyfQojIGFycmFuZ2VzIGdyYXBocyBpbiByb3dzCnBhcihtZnJvdz1jKDEsMikpIyAxcm93LCAyIGNvbHVtbnMKYm94cGxvdChpciRTZXBhbC5MZW5ndGgsIGxhcyA9IDMsIG1haW4gPSAiU2VwYWwgTGVuZ3RoIikKYm94cGxvdChpciRTZXBhbC5XaWR0aCwgbGFzID0gMywgbWFpbiA9ICJTZXBhbCBXaWR0aCIpCmBgYApgYGB7cn0KcGFpcnMoaXJbLDE6Ml0pCmBgYApgYGB7cn0KcGFpcnMoaXJbLDE6NF0sIGNvbCA9IGlyJFNwZWNpZXMpCmBgYApgYGB7cn0KIyAzRCBHcmFwaHMKbGlicmFyeShwbG90bHkpCnBsb3RfbHkoaXIsIHggPSB+U2VwYWwuV2lkdGgsIHkgPSB+U2VwYWwuTGVuZ3RoLCB6ID0gflBldGFsLkxlbmd0aCwgY29sb3IgPSB+U3BlY2llcywgY29sb3JzID0gYygnI0NBMzgxQicsICcjQkZFODJBJywnI0JGQThBQScpKSAlPiUgYWRkX21hcmtlcnMoKQpgYGAKCmBgYHtyfQojIGdncGxvdDIKbGlicmFyeShnZ3Bsb3QyKQppciA9IGlyaXMKbmFtZXMoaXIpID0gYygic2VwYWwubGVuZ3RoIiwic2VwYWwud2lkdGgiLCAicGV0YWwubGVuZ3RoIiwicGV0YWwud2lkdGgiLCJjbGFzcyIpCm5hbWVzKGlyKQpgYGAKYGBge3J9CmBgYAoKCmBgYHtyfQpnZ3Bsb3QoaXIpICsgZ2VvbV9wb2ludChhZXMoeD1zZXBhbC5sZW5ndGgsIHk9c2VwYWwud2lkdGgsIGNvbG9yID0gY2xhc3MpKQpgYGAKYGBge3J9CiMgdmlzdWFsaXN0YWlvbgpnZ3Bsb3Qoc3Vic2V0KGlyLCBjbGFzcyAlaW4lIGMoInNldG9zYSIsICJ2aXJnaW5pY2EiKSkpICsKICBnZW9tX3BvaW50KGFlcyh4PXNlcGFsLmxlbmd0aCwgeT1zZXBhbC53aWR0aCwgY29sb3I9Y2xhc3MpKQpgYGAKYGBge3J9CiMgcG9pbnRzIChzY2F0dGVycGxvdHMpCmlyX3NldCA9IHN1YnNldChpciwgY2xhc3MgJWluJSBjKCJzZXRvc2EiKSkKYGBgCmBgYHtyfQpnZ3Bsb3QoaXJfc2V0LCBhZXMoeD1wZXRhbC5sZW5ndGgseT1wZXRhbC53aWR0aCkpICsgZ2VvbV9wb2ludCgpICsKICBnZ3RpdGxlKCJQZXRhbCBMZW5ndGggdnMgUGV0YWwgV2lkdGgiKQpgYGAKYGBge3J9CmdncGxvdChpcl9zZXQpICsgZ2VvbV9wb2ludChhZXMoeD1wZXRhbC5sZW5ndGgvcGV0YWwud2lkdGgsIHk9c2VwYWwubGVuZ3RoL3NlcGFsLndpZHRoKSkgKwogIGdndGl0bGUoIlNjYXR0ZXJQbG90IG9mIFJhdGlvbnMiKQpgYGAKYGBge3J9CiMgTGluZXMKaXJfdmVyc2kgPSBzdWJzZXQoaXIsIGNsYXNzICVpbiUgYygidmVyc2ljb2xvciIsICJ2aXJnaW5pY2EiKSkKaXJfdmVyc2kkcHJlZC5TTCA9IHByZWRpY3QobG0oc2VwYWwubGVuZ3RoIH4gbG9nKHBldGFsLmxlbmd0aCksIGRhdGEgPSBpcl92ZXJzaSkpCmdncGxvdChpcl92ZXJzaSwgYWVzKHg9bG9nKHBldGFsLmxlbmd0aCkseT1zZXBhbC5sZW5ndGgpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY2xhc3MpKSArIGdlb21fbGluZShhZXMoeT1wcmVkLlNMKSkgKwogIGdndGl0bGUoIlNlcGFsIExlbmd0aCB2cyBsb2cocGV0YWwubGVuZ3RoKSBGaXR0ZWQgd2l0aCBSZWdyZXNzaW9uIExpbmUiKQpgYGAKYGBge3J9CmlyX3NldCA9IHN1YnNldChpciwgY2xhc3MgJWluJSBjKCJzZXRvc2EiKSkKZ2dwbG90KGlyX3NldCwgYWVzKHg9c2VwYWwubGVuZ3RoLCB5PXNlcGFsLndpZHRoKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aCgpCmBgYApgYGB7cn0KIyBCb3hwbG90CmdncGxvdChpcikgKwogIGdlb21fYm94cGxvdChhZXMoeD1jbGFzcywgeT1zZXBhbC5sZW5ndGgpKSArIAogIGdndGl0bGUoIkJveHBsb3Qgb2YgU2VwYWwgTGVuZ3RoIikKYGBgCmBgYHtyfQojIGxldCdzIGNyZWF0ZSAiaW5kb29yIiAsIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgcmVjb3JkaW5nIGlmIHRoZSBwbGFudHMgd2VyZSBpbmRvb3IoVFJVRSkgb3Igb3V0ZG9vciAoRkFMU0UpIHBsYW50cwojIEZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgZ2l2ZSBpdCByYW5kb20gdmFsdWVzCmlyJGluZG9vciA9IHNhbXBsZShjKCJUUlVFIiwiRkFMU0UiKSwxNTAscmVwbGFjZT1UUlVFKQpnZ3Bsb3QoaXIpICsgZ2VvbV9ib3hwbG90KGFlcyh4PWNsYXNzLHk9c2VwYWwubGVuZ3RoLCBmaWxsPWluZG9vcikpCmBgYApgYGB7cn0Kc3RhY2tlZF9pciA9IHN0YWNrKGlyWywxOjRdKQpoZWFkKHN0YWNrZWRfaXIsNSkKYGBgCmBgYHtyfQpnZ3Bsb3Qoc3RhY2soaXJbLDE6NF0pLCBhZXMoeD1pbmQseT12YWx1ZXMpKSArIGdlb21fYm94cGxvdCgpICsKICB4bGFiKCJBdHRyaWJ1dGVzIikgKyB5bGFiKCJNaWxpbWl0ZXJzIikgKyAKICBnZ3RpdGxlKCJCb3hwbG90IG9mIEF0dHJpYnV0ZXMiKQpgYGAKYGBge3J9CmxpYnJhcnkoImdncmVwZWwiKQpnZ3Bsb3QoaXIsYWVzKHg9c2VwYWwubGVuZ3RoLHk9c2VwYWwud2lkdGgpKSArIAogIGdlb21fdGV4dChhZXMobGFiZWw9cGV0YWwubGVuZ3RoKSwgc2l6ZT0zKSArCiAgZ2d0aXRsZSgiU2VwYWwgTGVuZ3RoIHZzIFNlcGFsIFdpZHRoIikKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncmVwZWwpCnAxID0gZ2dwbG90KGlyX3NldCwgYWVzKHg9c2VwYWwubGVuZ3RoLHk9c2VwYWwud2lkdGgpKQpwMSArIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9cGV0YWwubGVuZ3RoKSwgZm9yY2U9MykKYGBgCgpgYGB7cn0KIyBBZXN0aGV0aWMgTWFwcGluZwpwMSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IDIpLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIikKYGBgCmBgYHtyfQpnZ3Bsb3QoaXIsIGFlcyh4PXNlcGFsLmxlbmd0aCx5PXNlcGFsLndpZHRoKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBldGFsLmxlbmd0aCwgc2hhcGUgPSBjbGFzcykpCmBgYApgYGB7cn0KIyBTY2FsZSBNb2RpZmljYXRpb24KcDEgPSBnZ3Bsb3QoaXIsIGFlcyh4PXBldGFsLmxlbmd0aCx5PXBldGFsLndpZHRoKSkgKyAKICBnZW9tX3BvaW50KCkKcDEKYGBgCmBgYHtyfQojIE5vdywgbGV04oCZcyBjcmVhdGUgYSBuZXcgc2NhbGUsIHRoYXQgZGl2aWRlcyBmbG93ZXJzIGludG8g4oCcUywgTSwgTCwgWEwsWFhM4oCdIGFjY29yZGluZyB0byB0aGVpciBTZXBhbCBMZW5ndGguIFdlIG1hbnVhbGx5IGNvZGUgZWFjaCBzaXplIGludGVydmFsIHNvIHRoYXQgUyA8IDQuMywgNC4zIDwgTSA8IDUuMywgNS4zIDwgTCA8IDYuMywgNi4zIDwgWEwgPCA3LjksIGFuZCBYWEwgPiA3LjkuIApwMSArIGdlb21fcG9pbnQoYWVzKGNvbG9yPXNlcGFsLmxlbmd0aCksCiAgICAgICAgICAgICAgICBhbHBoYT0wLjUsc2l6ZT0xLjUpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTGVuZ3RoIG9mIHRoZSBwZW50YWxzIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIldpZHRoIG9mIHRoZSBwZW50YWxzIikgKwogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobmFtZSA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYyg0LjMsNS4zLDYuMyw3LjMsNy45KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlMiLCJNIiwiTCIsIlhMIiwiWFhMIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikKYGBgCmBgYHtyfQojIEZhY2V0aW5nCmN3ID0gQ2hpY2tXZWlnaHQKIyBUYWtlIGEgbG9vayBhdCB0aGUgZGF0YXNldApoZWFkKGN3LDUpCmBgYApgYGB7cn0KcCA9IGdncGxvdChjdywgYWVzKHg9d2VpZ2h0LHk9VGltZSkpCnAgKyBnZW9tX2xpbmUoYWVzKGNvbG9yID0gRGlldCkpCmBgYApgYGB7cn0KcCArIGdlb21fbGluZSgpICsgZmFjZXRfd3JhcCh+RGlldCkKYGBgCmBgYHtyfQpwNSA9IHAgKyBnZW9tX2xpbmUoKSArIGZhY2V0X2dyaWQofkRpZXQpCnA1CmBgYApgYGB7cn0KcDUgKyB0aGVtZV9jbGFzc2ljKCkKcDUgKyB0aGVtZV9ncmF5KCkKcDUgKyB0aGVtZV9idygpCmBgYApgYGB7cn0KcDUgKyB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAidHVycXVvaXNlIiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInR1cnF1b2lzZSIpKQpgYGAKYGBge3J9CnRoZW1lX25ldyA8LSB0aGVtZV9idygpICsKICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDEsIGNvbG9yID0iZ3JheSIsIGZpbGwgPSAiYmxhY2siKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiaXZvcnkiKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJwdXJwbGUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ0dXJxdW9pc2UiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAicGluayIpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJvcmFuZ2UiKQogICAgICAKICAgICAgICApCnA1ICsgdGhlbWVfbmV3CmBgYAoKCgoKCgoKCgoKCgoKCg==